package com.wang.tool.webtool;

import com.wang.tool.common.result.SimpleResult;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 统一响应模型构建器
 * 建议所有响应模型采用一套
 *
 * @Author wangshaopeng
 * @Date 2021/1/9
 */
public interface WebErrorResponseBuilder {


    /**
     * 请求的异常 的响应模型
     * 默认将返回值当作响应体返回
     * 如果想要跳转页面/转发,mvc原生函数也支持
     * response.sendRedirect("/500.html");//重定向
     * request.getRequestDispatcher("/500.html").forward(request,response);//转发
     * return null;//返回null即可
     *
     * //traceId
     * response.addHeader(TraceHolder.TRACE_ID, TraceHolder.getTraceId());
     * //serverIp
     * response.addHeader(LocalIpUtil.SERVER_IP, LocalIpUtil.getLocalIp());
     * @param defErrorResult 默认异常模型 非空
     * @param e             非空
     * @param request       非空
     * @param response      非空
     * @return 响应模型, 返回null系统无响应
     * @throws RuntimeException 抛异常会采用默认逻辑处理,向用户响应defErrorResponse
     */
    Object build4InternalError(SimpleResult<Void> defErrorResult, Throwable e, HttpServletRequest request, HttpServletResponse response);


    /**
     * 系统自动转发到/error请求 的响应模型
     * @param defErrorUriResult 默认异常模型 非空,ext是spring统一包装的errorAttr
     *                         类似于:{
     *                         "timestamp": "2022-06-14T01:13:20.892+0000",
     *                         "status": 404,
     *                         "error": "Not Found",
     *                         "message": "No message available",
     *                         "path": "/hello"
     *                         }
     * @return 响应模型, 返回null系统无响应
     * @throws RuntimeException 抛异常会采用默认逻辑处理,向用户响应defErrorUriResult
     */
    Object build4ErrorURI(SimpleResult<Void> defErrorUriResult, HttpServletResponse response);

}
